﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include <set>

/*
GmepComponent, GmepComponentType, GmepComponentParameterValue 结构用于下载云端项目构件库时 的数据结构。
数据临时存储后， 用于往 sqlite 写这些数据。
*/

// v0.19 本地修改后的标记
enum class GmepComponentDirtyFlag : int32_t
{
    UnChanged = 0,                                  ///< 0: 无更改
    LocalModified = 1,                              ///< 1： 本地有修改
    LocalDeleted = 2,                               ///< 2， 本地已删除
    LocalAddedFromPublic = 3,                       ///< 3： 本地从公共库新增的，未编辑 // 流程已改已废弃
    LocalAddedFromPublicThenModify = 4,             ///< 4： 本地从公共库新增的，然后编辑// 流程已改已废弃
    LocalAddedFromGAC = 5,                          ///< 5： 本地从GAC新增的，未编辑
    LocalAddedFromGACThenModify = 6,                ///< 6： 本地从GAC新增的，然后编辑
    
};

struct GmepComponentParameterValue
{
    GmepComponentParameterValue()
        : name(L"")
        , code(L"")
        , value(L"")
        , unit(L"")
        , unitCode(L"")
        , isDriveParameter(false)
        , storageType(-1)
    {}
    std::wstring name; //长度     "电源类型",
    std::wstring code; //"4323171101",  "43511703",
    std::wstring value;//"100",    "4351170302",
    std::wstring unit;//"mm",
    std::wstring unitCode;//"4321110105"

    bool isDriveParameter = false;
    int storageType;
};

struct GmepComponentType
{
    std::wstring typeName = L"";
    std::wstring typeId = L"";
    std::map <std::wstring, GmepComponentParameterValue> paramValues = {}; // standardCode to paramValues
    // or dimension name to paramValues

    std::wstring GetComponentGeometryParamValueString(bool bDriveParameter=true) 
    {
        std::wstring retGeometryValue;

        std::map <std::wstring, GmepComponentParameterValue>::iterator iter = paramValues.begin();
        for (; iter != paramValues.end(); iter++)
        {
            // iter->second.code 为空则是几何参数，不是标准属性
            if (iter->second.code.empty() && iter->second.isDriveParameter == bDriveParameter)
            {
                std::wstring thisParamValue = iter->second.name + L"=" + iter->second.value + L";";
                retGeometryValue += thisParamValue;
            }
        }
        return retGeometryValue;
    }
};
#define GMEP_FAMILY_FILE_EXT      L".gac"
#define GMEP_FAMILY_PNG_FILE_EXT      L".png"

#define GMEP_PLACEHOLDER_TYPE_PLAN L"PLAN" //平面图例
#define GMEP_PLACEHOLDER_TYPE_ELEVATION L"ELEVATION" // 前后立面图例 (立面图例)
#define GMEP_PLACEHOLDER_TYPE_PROFILE L"PROFILE" // 左右立面图例(侧面图例)

#define GMEP_PLACEHOLDER_DISCIPLINE_COMMON  L"COMMON"
#define GMEP_PLACEHOLDER_DISCIPLINE_ELECTRIC  L"ELECTRIC"

// 协同空间类型
#define GMEP_GDC_SPACETYPENAME_SHARE L"share" // 共享空间
#define GMEP_GDC_SPACETYPENAME_ENTERPRISE L"enterprise" // 企业空间（用于企业图例库）
#define GMEP_GDC_SPACETYPENAME_PROJECT L"project" // 项目空间（用于项目图例库）

struct GmepComponentPlaceHolderInfo
{
    GmepComponentPlaceHolderInfo()
        : id(L"")
        , name(L"")
        , thumbnailUrl(L"")
        , localName(L"")
        , categoryCode(L"")
        , placeHolderType(1)
        , placeholderFrom(0)
        , enterpriseSPUId(L"")
        , enterpriseResourceId(L"")
        , gacUrl(L"")
    {}
    std::wstring id;
    std::wstring name;  // 名称 路径： .../Productlibrary_2D/Pump/水泵_2D 或Productlibrary_2D/Pump/水泵_2D_Front（无.gac）
    std::wstring thumbnailUrl;

    std::wstring localName;

    // 用于从公共库下载的字段
    std::wstring categoryCode;
    int placeHolderType; // 1平面 , 2，前后立面,3 左右立面, 4 电气图例
    int placeholderFrom; //0公共库，1企业库，2 共享空间，3项目库 
    std::wstring enterpriseSPUId;
    std::wstring enterpriseResourceId;//企业库 resourceid
    std::wstring gacUrl;
};

struct GmepComponent
{
    std::wstring categoryCode = L"";                      // 种类
    std::wstring id = L"";                                // 项目构件ID
    std::wstring publicComponentId = L"";                 // 公共库id， 若不是从公共库来，则置为0
    std::wstring publicSourceVersion = L"";               // 公共库来源Version 0.18/0.19， 若不是从公共库来，则置为0
    std::wstring enterPriseComponentId = L"";             // 企业库ID ,企业库为guid，其他为空 
    std::wstring name = L"";                              // 构件名
    std::wstring localName = L"";                         // 安装包路径图片名 ———— added by dengb-c@20210203
    std::wstring thumbnailURL = L"";                      // download3D的地址
    std::wstring thumbnailFilePath = L"";
    std::wstring familyFilePath = L"";
    std::wstring mergedFamilyFilePath = L"";

    std::wstring thumbnail2DFileId = L"";                 // 主图例作为2D预览图片的对应2D构件的id （可以为空，与family2DFileId， family2DLeftFileId，family2DFrontFileId） 中的一个相同）
    GmepComponentPlaceHolderInfo family2DInfo;      // 2D 平面图例构件的info  （可以为空）
    GmepComponentPlaceHolderInfo family2DFrontInfo; // 2D 前后立面图例构件的info （可以为空）
    GmepComponentPlaceHolderInfo family2DLeftInfo;  // 2D 左右立面（侧面）图例构件的info （可以为空）
    GmepComponentPlaceHolderInfo family2DElecInfo;  // 2D 电气图例构件的info （可以为空）

    std::wstring geometryParamDefinitions; // 几何参数的定义的json 字符串， 是否实例，是否驱动，单位 等
                  
    int version = 1;                                    // 网络版本号
    int iSource = 0;                                    // 构件来源标志，构件来源：0公共构件,1本地上传,2企业构件
    bool isLatest = true;
    GmepComponentDirtyFlag dirtyFlag = GmepComponentDirtyFlag::UnChanged;
    long long iTimeStamp = 0;

    std::vector<GmepComponentType> types = {};

};

/// \brief 构件信息
struct ComponentInfos
{
    std::wstring wstrLocalId = L"";                       /// <本地库构件信息ID
    std::wstring wstrPublicCompId = L"";                  /// <公共库构件信息ID
    std::wstring wstrPublicSourceVersion = L"";           /// <公共库构件来源Version 0.18, 0.19
    std::wstring wstrName = L"";                          /// <目标构件名称
    std::wstring wstrCategoryCode = L"";                  /// <分类代码
    std::wstring wstrTableName = L"";                     /// <表名
};

/// \brief 构件属性表字段及其分类代码
struct SqlRecordInfo
{
    std::wstring wstrName = L"";                          /// <字段名
    std::wstring wstrStdCode = L"";                       /// <标准码
};

/// \brief 新增本地gac的信息， 从db3 中读取的数据结构
struct GacFileInfo
{
    std::wstring m_id = L""; // oldId
    std::wstring m_categoryCode = L"";
    std::wstring m_filePath = L"";
    std::wstring m_thumbnailFilePath = L"";
    std::wstring m_gacProjectAppName = L"";
    std::wstring m_gacProjectAppVersion = L"";
};

/// \brief 从服务端读取的构件信息
struct HttpComponentInfo
{
	std::wstring CategoryCode;
	std::wstring PublicComponentId;
    std::wstring ComponentId;
	std::wstring Name;
	std::wstring Version;
};

struct ChangedComponentIdSet
{
    ChangedComponentIdSet()
    :LastQueryTime(-1),
    CurrentTime(0)
    {        
    }

    long long LastQueryTime;
    long long CurrentTime;
    std::wstring MajorInfo = L"2"; //专业信息，默认机电专业2，建筑为1
    std::set<std::wstring> NeedFilteredCategoryCodeSet;
    std::map<std::wstring, int> UpdateComponentIdList;
    std::map<std::wstring, int> DeletedComponentIdList;
    std::map<std::wstring, ComponentInfos> LocalComponentIdList;
};